#include "login.h"
#include "MessageType.h"
#include "network.h"
#include "widget.h" // 添加对 Widget 的头文件引用
#include "tcpsocketsingleton.h"
#include "registerpage.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QMessageBox>


Login::Login(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("医生端");
    this->setWindowIcon(QIcon(":doctorimg/img/doctorIcon.png"));

    // 设置主窗口背景及控件样式
    this->setStyleSheet(
        "QWidget { background-color: rgba(255, 240, 245, 0.95); }" // 整体背景为浅粉色
        "QLabel { color: #880E4F; font-size: 24px; font-weight: bold; }" // 增大字体为24px
        "QLineEdit { min-height: 40px; background-color: rgba(255, 255, 255, 0.9); "
        "border: 2px solid #F48FB1; padding: 12px; border-radius: 10px; font-size: 20px; color: black; }" // 调整输入框
        "QPushButton { min-width: 100px; min-height: 40px; background-color: #F8BBD0; color: white; border: 2px solid #F48FB1; "
        "padding: 15px 30px; border-radius: 12px; font-size: 22px; font-weight: bold; }" // 按钮背景、字体及大小设置
        "QPushButton:hover { background-color: #F48FB1; }" // 悬停时按钮背景变深粉色
    );

    // 设置动态调整窗口大小和控件居中
    this->setMinimumSize(400, 300); // 设置窗口最小大小
    this->resize(800, 600); // 设置初始窗口大小

    // 创建主布局
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->setAlignment(Qt::AlignCenter); // 设置主布局为居中

    // 添加间隔，设置标题与顶部的距离
    mainLayout->addSpacerItem(new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding));

    // 添加标题标签并设置为大标题
    QLabel *titleLabel = new QLabel("医生客户端");
    titleLabel->setStyleSheet("font-size: 64px; font-weight: bold; color: #880E4F;"); // 设置标题样式
    titleLabel->setAlignment(Qt::AlignCenter); // 设置标题居中对齐
    mainLayout->addWidget(titleLabel);

    // 添加间隔
    mainLayout->addSpacerItem(new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Fixed));

    // 创建用户标签和输入框的水平布局
    QLabel *userLabel = new QLabel("用户名:");
    // QLineEdit *lineEdit_user = new QLineEdit();
    // lineEdit_user->setObjectName("lineEdit_user"); // 设置对象名以便后续使用
    // lineEdit_user->setFixedWidth(600); // 设置输入框宽度一致
    lineEdit_user = new QLineEdit();
    lineEdit_user->setObjectName("lineEdit_user");
    lineEdit_user->setFixedWidth(600);
    QHBoxLayout *userLayout = new QHBoxLayout();
    userLayout->addWidget(userLabel); // 用户标签
    userLayout->addWidget(lineEdit_user); // 用户输入框
    mainLayout->addLayout(userLayout); // 将用户布局添加到主布局

    // 添加间隔
    mainLayout->addSpacerItem(new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Fixed));

    // 创建密码标签和输入框的水平布局
    QLabel *passwordLabel = new QLabel("密码:");
    // QLineEdit *lineEdit_password = new QLineEdit();
    // lineEdit_password->setEchoMode(QLineEdit::Password); // 密码输入框设置为密码模式
    // lineEdit_password->setObjectName("lineEdit_password"); // 设置对象名以便后续使用
    // lineEdit_password->setFixedWidth(600); // 设置输入框宽度一致
    lineEdit_password = new QLineEdit();
    lineEdit_password->setEchoMode(QLineEdit::Password);
    lineEdit_password->setObjectName("lineEdit_password");
    lineEdit_password->setFixedWidth(600);
    QHBoxLayout *passwordLayout = new QHBoxLayout();
    passwordLayout->addWidget(passwordLabel); // 密码标签
    passwordLayout->addWidget(lineEdit_password); // 密码输入框
    mainLayout->addLayout(passwordLayout); // 将密码布局添加到主布局

    // 添加间隔
    mainLayout->addSpacerItem(new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Fixed));

    // 创建登录和注册按钮
    QPushButton *pushButton_login = new QPushButton("登录");
    QPushButton *pushButton_register = new QPushButton("注册");

    // 为登录按钮设置快捷键 Enter
    pushButton_login->setShortcut(Qt::Key_Return);

    // 添加按钮到主布局
    mainLayout->addWidget(pushButton_login);
    mainLayout->addSpacerItem(new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Fixed)); // 按钮之间的间隔
    mainLayout->addWidget(pushButton_register);

    // 设置主布局
    this->setLayout(mainLayout);

    messageType = "Login_Logic";
    // 获取 TCP Socket
    tcpSocket = TcpSocketSingleton::instance().socket();

    // 断开之前所有处理函数的连接
    // disconnect(tcpSocket, &QTcpSocket::readyRead, nullptr, nullptr);

    // 连接 tcpSocket 的 readyRead 信号到槽函数
    connect(tcpSocket, &QTcpSocket::readyRead, this, &Login::handleLogin);

    // connect(tcpSocket, &QTcpSocket::readyRead, this, [this, lineEdit_user, lineEdit_password]() {
    //     if (messageType == "Login_Logic") {
    //         QByteArray responseData = tcpSocket->readAll();
    //         qDebug() << "处理登陆逻辑";
    //         QList<QMap<QString, QString >> responseMap = convertByteArrayToQMapArrayCustom(responseData);

    //         // 登录窗口中包含用户输入的用户名和密码字段
    //         QString enteredUser = lineEdit_user->text();
    //         QString enteredPassword = lineEdit_password->text();
    //         bool loginSuccessful = false;

    //         // 遍历 responseMap，查找匹配的用户名和密码
    //         for (const QMap<QString, QString>& map : responseMap) {
    //             if (map.value("name") == enteredUser && map.value("passward") == enteredPassword) {
    //                 loginSuccessful = true;
    //                 break;
    //             }
    //         }
    //         if (loginSuccessful) {
    //             emit loginSuccess(); // 发射登录成功信号
    //         } else {
    //             // 处理登录失败情况，例如弹出消息框
    //             QMessageBox::warning(this, "登陆", "姓名或密码非法");
    //         }
    //     }

    //     // QByteArray responseData = tcpSocket->readAll();
    //     // qDebug() << "处理登陆逻辑";
    //     // QList<QMap<QString, QString >> responseMap = convertByteArrayToQMapArrayCustom(responseData);

    //     // // 登录窗口中包含用户输入的用户名和密码字段
    //     // QString enteredUser = lineEdit_user->text();
    //     // QString enteredPassword = lineEdit_password->text();
    //     // bool loginSuccessful = false;

    //     // // 遍历 responseMap，查找匹配的用户名和密码
    //     // for (const QMap<QString, QString>& map : responseMap) {
    //     //     if (map.value("name") == enteredUser && map.value("passward") == enteredPassword) {
    //     //         loginSuccessful = true;
    //     //         break;
    //     //     }
    //     // }
    //     // if (loginSuccessful) {
    //     //     emit loginSuccess(); // 发射登录成功信号
    //     // } else {
    //     //     // 处理登录失败情况，例如弹出消息框
    //     //     QMessageBox::warning(this, "登陆", "姓名或密码非法");
    //     // }
    // });

    connect(pushButton_login, &QPushButton::clicked, this, [this]() {
        QString user = lineEdit_user->text();
        QString password = lineEdit_password->text();

        // 准备查询请求数据
        QMap<QString, QString> data;
        data.insert("type", DOCTORUSRDATABASE);
        data.insert("databaseoperator", QString::number(SELECT));
        data.insert("name", user);
        data.insert("passward", password);
        data.insert("senderType",DOCTORMESSAGE);

        // messageType = "Login_Logic";

        // 转换为 QByteArray 并发送
        QByteArray sendData = mapToByteArrayCustom(data);
        if (tcpSocket->state() == QAbstractSocket::ConnectedState) {
            tcpSocket->write(sendData);
        } else {
            QMessageBox::warning(this, "SocketError", "没有和服务器取得连接");
        }
    });

    connect(pushButton_register, &QPushButton::clicked, this, [this]() {
        // 创建注册页面实例并显示
        regPage = new registerPage(); // 设置父对象
        regPage->show();
    });

    connect(this, &Login::loginSuccess, this, &Login::onLoginSuccess); // 连接信号到槽
}

Login::~Login()
{
    // delete ui; // 不再使用 ui，已手动创建控件
    delete mainwidget; // 删除指针对象，避免内存泄漏
    delete regPage; // 删除注册页面实例，避免内存泄漏
}

void Login::handleLogin()
{
    if (messageType == "Login_Logic") {
        QByteArray responseData = tcpSocket->readAll();
        qDebug() << "处理登陆逻辑";
        QList<QMap<QString, QString >> responseMap = convertByteArrayToQMapArrayCustom(responseData);

        // 登录窗口中包含用户输入的用户名和密码字段
        QString enteredUser = lineEdit_user->text();
        QString enteredPassword = lineEdit_password->text();
        bool loginSuccessful = false;

        // 遍历 responseMap，查找匹配的用户名和密码
        for (const QMap<QString, QString>& map : responseMap) {
            if (map.value("name") == enteredUser && map.value("passward") == enteredPassword) {
                loginSuccessful = true;
                break;
            }
        }
        if (loginSuccessful) {
            emit loginSuccess(); // 发射登录成功信号
        } else {
            // 处理登录失败情况，例如弹出消息框
            QMessageBox::warning(this, "登陆", "姓名或密码非法");
        }
    }
}

void Login::onLoginSuccess()
{
    mainwidget = new Widget(); // 创建 Widget 实例
    mainwidget->show(); // 显示 Widget 界面
    this->close(); // 关闭登录窗口
}
